package com.sinog.biz.service.business.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mongodb.client.result.DeleteResult;
import com.sinog.biz.mapper.havexml.JytjMapper;
import com.sinog.biz.service.business.JytjService;
import com.sinog.core.domain.Jytj;
import com.sinog.core.model.JytjInfo;
import com.sinog.core.util.JsonUtil;
import com.sinog.core.util.MapUtil;
import com.sinog.core.utilbean.Constants;
import com.sinog.core.utilbean.Result;
import com.sinog.core.utilbean.ReturnCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @desc 安帮工作资源管理 - 安帮资料信息管理 - 经验推介 - JytjServiceImpl
 * @author zhangcb
 * @date -
 */
@Slf4j
@Service
public class JytjServiceImpl implements JytjService {

    @Resource
    private JytjMapper jytjMapper;
    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 安帮工作资源管理 - 安帮资料信息管理 - 经验推介 - 获取首页经验推介列表
     * @param account account
     * @param username username
     * @param level level
     * @param departId departId
     * @return List<HashMap < String,Object>>
     */
    @Override
    public List<HashMap<String,Object>> getSyJytjList(String account,String username,String level,String departId) {
        level = level.replaceAll("^(0+)","");
        return jytjMapper.getSyJytjList(account,username,level,departId);
    }

    /**
     * 安帮工作资源管理 - 安帮资料信息管理 - 经验推介 - 列表
     * @param pageIndex pageIndex
     * @param pageSize pageSize
     * @param mapkey mapkey
     * @return Page<Map < String,String>>
     */
    @Override
    public Page<Map<String,String>> getJytjInfoList(Integer pageIndex,Integer pageSize,Map<String,Object> mapkey) {
        MapUtil.requestConversionToMap(mapkey);
        Page<Map<String,String>> page = new Page<>(pageIndex + 1,pageSize);
        return page.setRecords(jytjMapper.getJytjInfoList(page,mapkey));
    }

    /**
     * 安帮工作资源管理 - 安帮资料信息管理 - 经验推介 - 保存信息
     * @param data data
     * @return boolean
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean saveJytjInfo(String data) {
        Date date = new Date();
        //参数实体
        Jytj jytj = JsonUtil.toBean(data,Jytj.class);
        //数据库查询实体
        Jytj dbJytj = jytj.selectById();
        //新增
        if(null == dbJytj) {
            jytj.setCreateTime(date);
        }
        jytj.setUpdateTime(date);
        boolean flag = jytj.insertOrUpdate();
        if(flag) {
            JytjInfo jytjInfo = JsonUtil.toBean(data,JytjInfo.class);
            jytjInfo.setAddtime(date);
            try {
                mongoTemplate.save(jytjInfo,"jytjInfo");
                return true;
            } catch(DataAccessResourceFailureException e) {
                log.error("\n>>>>>>>>>>>>>>>>>>>>>>>> mongodb服务器连接异常!!! <<<<<<<<<<<<<<<<<<<<<<<<<<");
                //如果mongodb发生错误，回滚mysq事务
                throw new RuntimeException("mongodb服务器连接异常");
            } catch(RuntimeException e) {
                log.error("发生异常:{}",e.getMessage());
                //如果mongodb发生错误，回滚mysq事务
                throw new RuntimeException("mongodb服务器连接异常");
            }
        }
        return false;
    }

    /**
     * 安帮工作资源管理 - 安帮资料信息管理 - 经验推介 - 删除
     * @param id id
     * @return boolean
     */
    @Override
    public boolean deleteJytjInfo(String id) {
        Query query = new Query(Criteria.where("_id").is(id));
        DeleteResult result;
        try {
            result = mongoTemplate.remove(query,JytjInfo.class);
            long count = result.getDeletedCount();
            if(0 < count) {
                //删除经验推介文件表
                Jytj jytj = new Jytj();
                return jytj.deleteById(id);
            }
        } catch(DataAccessResourceFailureException e) {
            log.error("\n>>>>>>>>>>>>>>>>>>>>>>>> mongodb服务器连接异常!!! <<<<<<<<<<<<<<<<<<<<<<<<<<");
        } catch(Exception e) {
            log.error("\nmongodb执行发生错误{}\n",e.getMessage());
        }
        return false;
    }

    /**
     * 安帮工作资源管理 - 安帮资料信息管理 - 经验推介 - 获取是否是自己发布的
     * @param map map
     * @return int
     */
    @Override
    public int checkIfOwnerPublish(Map<String,Object> map) {
        return jytjMapper.checkIfOwnerPublish(map);
    }

    /**
     * 安帮工作资源管理 - 安帮资料信息管理 - 经验推介 - 发布/取消发布
     * @param id id
     * @param stateValue stateValue
     * @return Result
     */
    @Override
    public Result setfabuState(String id,String stateValue) {
        Jytj jytj = new Jytj();
        Jytj fabuStateInfo = jytj.selectById(id);
        fabuStateInfo.setFabustate(stateValue);
        if(Constants.NumberStr.NUM_STR_ZERO.equals(stateValue)) {
            fabuStateInfo.setFabutime(null);
        } else {
            fabuStateInfo.setFabutime(new Date());
        }
        boolean tag = fabuStateInfo.insertOrUpdate();
        if(tag) {
            return Result.success();
        }
        return Result.failure(ReturnCode.FAILURE);
    }

    /**
     * 安帮工作资源管理 - 安帮资料信息管理 - 经验推介 - mongo 获取经验推介信息
     * @param id id
     * @return JytjInfo
     */
    @Override
    public JytjInfo findJytjById(String id) {
        JytjInfo jytjInfo = null;
        try {
            jytjInfo = mongoTemplate.findById(id,JytjInfo.class);
        } catch(DataAccessResourceFailureException e) {
            log.error("\n>>>>>>>>>>>>>>>>>>>>>>>> mongodb服务器连接异常!!! <<<<<<<<<<<<<<<<<<<<<<<<<<");
        } catch(Exception e) {
            log.error("\nmongodb执行发生错误{}\n",e.getMessage());
        }
        return jytjInfo;
    }
}